import { getConfig } from "/@/config";
import { toRouteType } from "./types";
import NProgress from "/@/utils/progress";
import { findIndex } from "lodash-unified";
import type { StorageConfigs } from "/#/index";
import { transformI18n } from "/@/plugins/i18n";
import { useMultiTagsStoreHook } from "/@/store/modules/multiTags";
import { usePermissionStoreHook } from "/@/store/modules/permission";
import { useUserStoreHook } from "/@/store/modules/user";
import { getAuthInfoApi } from '/@/api/system/auth'

import {
  Router,
  createRouter,
  RouteRecordRaw,
  RouteComponent
} from "vue-router";
import {
  ascending,
  initRouter,
  getHistoryMode,
  findRouteByPath,
  handleAliveRoute,
  formatTwoStageRoutes,
  formatFlatteningRoutes
} from "./utils";
import {
  buildHierarchyTree,
  openLink,
  isUrl,
  storageSession
} from "@pureadmin/utils";

import homeRouter from "./modules/home";
import errorRouter from "./modules/error";
import remainingRouter from "./modules/remaining";


/** 原始静态路由（未做任何处理） */
const routes = [homeRouter, errorRouter];

/** 导出处理后的静态路由（三级及以上的路由全部拍成二级） */
export const constantRoutes: Array<RouteRecordRaw> = formatTwoStageRoutes(
  formatFlatteningRoutes(buildHierarchyTree(ascending(routes)))
);

/** 用于渲染菜单，保持原始层级 */
export const constantMenus: Array<RouteComponent> = ascending(routes).concat(
  ...remainingRouter
);

/** 不参与菜单的路由 */
export const remainingPaths = Object.keys(remainingRouter).map(v => {
  return remainingRouter[v].path;
});

/** 创建路由实例 */
export const router: Router = createRouter({
  history: getHistoryMode(),
  routes: constantRoutes.concat(...(remainingRouter as any)),
  strict: true,
  scrollBehavior(to, from, savedPosition) {
    return new Promise(resolve => {
      if (savedPosition) {
        return savedPosition;
      } else {
        if (from.meta.saveSrollTop) {
          const top: number =
            document.documentElement.scrollTop || document.body.scrollTop;
          resolve({ left: 0, top });
        }
      }
    });
  }
});

/** 重置路由 */
export function resetRouter() {
  router.getRoutes().forEach(route => {
    const { name, meta } = route;
    if (name && router.hasRoute(name) && meta?.backstage) {
      router.removeRoute(name);
      router.options.routes = formatTwoStageRoutes(
        formatFlatteningRoutes(buildHierarchyTree(ascending(routes)))
      );
    }
  });
  usePermissionStoreHook().clearAllCachePage();
}

/** 路由白名单 */
const whiteList = ["/login"];

router.beforeEach(async (to: toRouteType, _from, next) => {
  if (to.meta?.keepAlive) {
    const newMatched = to.matched;
    handleAliveRoute(newMatched, "add");
    // 页面整体刷新和点击标签页刷新
    if (_from.name === undefined || _from.name === "Redirect") {
      handleAliveRoute(newMatched);
    }
  }

  const userStore = useUserStoreHook()
  NProgress.start();
  const externalLink = isUrl(to?.name as string);
  if (!externalLink) {
    // to.matched.some(item => {
    //   if (!item.meta.title) return "";
    //   const Title = getConfig().Title;
    //   if (Title)
    //     document.title = `${transformI18n(item.meta.title)} | ${Title}`;
    //   else document.title = transformI18n(item.meta.title);
    // });
  }

  if (to.meta?.title) {
    document.title = `${transformI18n(to.meta.title)} | ${getConfig().Title}`
  } else {
    document.title = getConfig().Title;
  }

  if (userStore.token) {
    // 刷新
    if (usePermissionStoreHook().wholeMenus.length === 0) {
      const { data } = await getAuthInfoApi();
      const { menus, permissions } = data;
      const router = await initRouter(menus)

      if (!useMultiTagsStoreHook().getMultiTagsCache) {
        const { path } = to;
        const routes = router.getRoutes()

        // const index = findIndex(remainingRouter, v => {
        //   return v.path == path;
        // });

        // const routes: any =
        //   index === -1
        //     ? router.options.routes[0].children
        //     : router.options.routes;

        // const route = findRouteByPath(path, routes);
        const route = routes.find(s => s.path === path)

        // query、params模式路由传参数的标签页不在此处处理
        if (route && route.meta?.title) {
          useMultiTagsStoreHook().handleTags("push", {
            path: route.path,
            name: route.name,
            meta: route.meta
          });
        }
      }

      // return next()

      return next({ path: to.fullPath, replace: true })
      // router.push(to.fullPath);
    }

    // name为超链接
    // if (externalLink) {
    //   openLink(to?.name as string);
    //   NProgress.done();
    //   return;
    // }
    next();
  } else {
    if (to.path !== "/login") {
      if (whiteList.indexOf(to.path) !== -1) {
        next();
      } else {
        next({ path: "/login" });
      }
    } else {
      next();
    }
  }
});

router.afterEach(() => {
  NProgress.done();
});

export default router;
